home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / src / ean / mailer.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-02-01  |  5.7 KB  |  243 lines

  1. /*----------------------------------------------------------*/
  2. /*     EAN Mail System User Agent -- UUCP/EAN gateway mailer*/
  3. /*                                                          */
  4. /*                   September, 1983                        */
  5. /*                                                          */
  6. /*          Author: Rick Sample                             */
  7. /*                  University of British Columbia          */
  8. /*                                                          */
  9. /*      This is a utility program to interface to UUCP mail */
  10. /*  delivery, and re-route it into the EAN mail system. It  */
  11. /*  reads the message (in ARPA RFC 822 format) from the     */
  12. /*  standard input.                                         */
  13. /*                                                          */
  14. /*----------------------------------------------------------*/
  15.  
  16. #include "../util/interface.h"
  17. #include "../util/log.h"
  18. #include "../ccitt/interface.h"
  19. #include "../mta/rec.h"
  20. #include "../mta/p1.h"
  21. #include "../mta/P1interf.h"
  22. #include "../ua/message.h"
  23. #include "../ua/P2.h"
  24. #include "../ua/key.h"
  25. #include "../ua/or.h"
  26. #include "../ua/input.h"
  27. #include "../nsg/A822/A822_in.h"
  28. #include <sysexits.h>
  29. #include <stdio.h>
  30.  
  31. #define            DOM_STR            "uucp"
  32. #define            CONNECTION      ".local"
  33.  
  34. EDESC            P1_desc =
  35.   {
  36.     P1_get,
  37.     P1_getbuff,
  38.     P1_put,
  39.     P1_putbuff,
  40.     0,
  41.     0
  42.   };
  43.  
  44.  
  45. main (argc, argv)
  46. int    argc;
  47. char  *argv[];
  48.   {
  49.     LOG_DESC    log;
  50.     char    str[100];
  51.     char*     recip_name;
  52.     char      userid[20];
  53.     char      hostid[20];
  54.     char*     sender;
  55.     char*     dflt;
  56.     int       i,
  57.           rc,
  58.           len,
  59.           count,
  60.           ignore;
  61.     ENODE*    dsi;
  62.     ENODE*    trace;
  63.     ENODE*    tr_seq;
  64.     ENODE*    e;
  65.     ENODE*    env;
  66.     ENODE*    domain;
  67.     ENODE*    recip;
  68.     ENODE*    reclist;
  69.     ENODE*    orname;
  70.     ENODE*    mpdu;
  71.     ENODE*    content;
  72.     FILE*     f;
  73.     P1ID*     p1id;
  74.     long      cont_len;
  75.     TIME      t;
  76.     
  77.     if (Local_info () != OK) 
  78.       {
  79.     fputs ("Local info unavailable.\n", stderr);
  80.     exit (EX_SOFTWARE);
  81.       }
  82.  
  83.     reclist = NULL;
  84.  
  85.     count = 0;
  86.     
  87.     recip_name = cpystr ("");
  88.     len = 1;
  89.  
  90.     for (i = 0; i < argc; ++i)
  91.     if (argv[i][0] == '-')
  92.         switch (argv[i][1])
  93.           {
  94.         case 'd': 
  95.             if (i++ == argc)
  96.                     exit (EX_DATAERR);
  97.             while (i < argc && argv[i][0] != '-') 
  98.               {
  99.             if ((orname = Bld_ORname (argv[i], &rc)) == NULL) 
  100.               {
  101.                 fprintf (stderr, "Bad address argument: %s.\n",
  102.                     argv[i]);
  103.                 exit (EX_DATAERR);
  104.               }
  105.  
  106.                 recip = NULL;
  107.             Set_add (&recip, orname);
  108.             e = Bit_set ((ENODE*) NULL, P1_RESPONSIBLE);
  109.             Bit_set (e, P1_URQBASIC);
  110.             e->id = CONTEXT + 1L;
  111.             Set_add (&recip, e);
  112.             Set_add (&recip, Bld_int (CONTEXT+0L, ++count));
  113.             Seq_add (&reclist, recip);
  114.     
  115.             catstr (&recip_name, &len, argv[i++]);
  116.             catstr (&recip_name, &len, " ");
  117.               }
  118.             break;
  119.           }
  120.  
  121.     if (reclist == NULL) 
  122.       {
  123.     fputs ("no recipient specified.\n", stderr);
  124.     exit (1);
  125.       }
  126.  
  127.     reclist->id = CONTEXT + 2L;
  128.  
  129.     if (P1_open (CONNECTION, NULL, &p1id) != OK) 
  130.       {
  131.     fputs ("Message Transfer Error.\n", stderr);
  132.     exit (EX_UNAVAILABLE);
  133.       }
  134.       
  135.     P1_desc.id = (char*) p1id;
  136.  
  137.     Userid (userid);
  138.     gethostname (hostid, 20);
  139.     
  140.     sender = cpystr (userid);
  141.     len = strlen (sender) + 1;
  142.     catstr (&sender, &len, "@");
  143.     catstr (&sender, &len, hostid);
  144.     catstr (&sender, &len, ".");
  145.     catstr (&sender, &len, DOM_STR);
  146.  
  147.     domain = NULL;
  148.     Seq_add (&domain, Bld_cons (P1_COUNTRY, Bld_prim (E_PRINTSTR, "")));
  149.     Seq_add (&domain, Bld_cons (P1_ADMINDOM, Bld_prim (E_PRINTSTR, "")));
  150.     Seq_add (&domain, Bld_prim (E_PRINTSTR, DOM_STR));;
  151.     
  152.     domain->id = P1_GLOBALID;
  153.  
  154.     ignore = (       strcmp (userid, "ean")     != 0
  155.         && strcmp (userid, "root")    != 0
  156.         && strcmp (userid, "mmdf")    != 0
  157.         && strcmp (userid, "uucp")    != 0
  158.         && strcmp (userid, "daemon")  != 0
  159.         && strcmp (userid, "network") != 0);
  160.     
  161.     if ((content = A822_in (&sender, stdin, ignore, DOM_STR, &cont_len))
  162.          == NULL)
  163.       {
  164.     fprintf (stderr, "Invalid or empty message.\n");
  165.     exit (EX_DATAERR);
  166.       }
  167.     
  168.     env = NULL;
  169.  
  170.     /* create P1.MPDUIdentifier for message envelope */
  171.     e = NULL;
  172.     Seq_add (&e, Ecpy (domain));
  173.     Seq_add (&e, Bld_prim (E_IA5_STRING, TS_get ()));
  174.     e->id = P1_MPDUID;
  175.     Set_add (&env, e);
  176.  
  177.     if ((e = Bld_recip (sender, &rc)) == NULL
  178.          || (e = Set_find (e, CONTEXT + 0L)) == NULL
  179.      || (e = Set_find (e, P1_ORNAME)) == NULL)
  180.       {
  181.     fputs ("invalid originator.\n", stderr);
  182.     exit (EX_DATAERR);
  183.       }
  184.  
  185.     
  186.     Set_add (&env, e);
  187.     
  188.     Set_add (&env, Bld_int (P1_CONTTYPE, 2L));
  189.     
  190.     if ((e = Find_heading (content, P2_MESSAGEID)) != NULL) 
  191.     Set_add (&env, Bld_prim (P1_UACONTID, Unb_MID (e)));
  192.     
  193.     Set_add (&env, reclist);
  194.     
  195.     trace = NULL;
  196.     Seq_add (&trace, Ecpy (domain));
  197.     
  198.     dsi = NULL;
  199.  
  200.     e = Bld_time (TR_get (&t));
  201.     e->id = CONTEXT + 0L;
  202.     Set_add (&dsi, e);
  203.     
  204.     Set_add (&dsi, Bld_int (CONTEXT+2L, 0L));
  205.     
  206.     Seq_add (&trace, dsi);
  207.   
  208.     tr_seq = NULL;
  209.     Seq_add (&tr_seq, trace);
  210.     tr_seq->id = P1_TRACEINFO;
  211.  
  212.     Set_add (&env, tr_seq);
  213.  
  214.     mpdu = NULL;
  215.     Seq_add (&mpdu, env);
  216.  
  217.     mpdu->id = P1_USERMPDU;
  218.  
  219.     if (P1_import (p1id, mpdu) != OK) 
  220.       {
  221.     fputs ("Message Transfer Failure.\n", stderr);
  222.     exit (EX_TEMPFAIL);
  223.       }
  224.     
  225.     Ewrite (&P1_desc, content);
  226.  
  227.     if (P1_end (p1id, TRUE) != OK) 
  228.       {
  229.     fputs ("Message Transfer Failed.\n", stderr);
  230.     exit (EX_OSERR);
  231.       }
  232.       
  233.     Efree (&content);
  234.     P1_close (&p1id);
  235.  
  236.     Log_init( LOG_SENDMAIL, &log );
  237.     sprintf( Log_str, "in : %d %0.25s %0.25s", cont_len, sender, recip_name );
  238.     Log_enter( &log, LOG_NORM, NULL );
  239.     Log_term( &log );
  240.  
  241.     exit (EX_OK);
  242.   }
  243.